package com.lh.nk;

import java.util.ArrayList;

/**
 * @author: linghao
 * @since: 2023/1/24
 *
 * 描述
 * 现在有一个只包含数字的字符串，将该字符串转化成IP地址的形式，返回所有可能的情况。
 * 例如：
 * 给出的字符串为"25525522135",
 * 返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)
 * 注意：ip地址是由四段数字组成的数字序列，格式如 "x.x.x.x"，其中 x 的范围应当是 [0,255]。
 *
 * 枚举法：
 * 就是在字符串中插入四个 . 使其符合ip格式，
 * 第一个点的条件，i<4 && i<n-2(即i<=n-3,至少留三位给后面的ip位置，因为下标是  0 -- n-1)
 * 第二个点：j<j+4 && j<n-1
 * 第三个点：i<
 */
public class 数字字符串转化成IP地址NC20 {


    public ArrayList<String> restoreIpAddresses (String s) {
        // write code here
        ArrayList<String>  res = new ArrayList<>();
        int n = s.length();
        for(int i=1;i<4 && i<n-2;i++){
            for(int j=i+1;j<i+4 && j<n-1;j++){
                for(int k=j+1;k<j+4 && k<n;k++){
                    //最后一段位数最多三个
                    if(n-k>=4)continue;
                    //点的位置开始截取
                    String a = s.substring(0,i);
                    String b = s.substring(i,j);
                    String c = s.substring(j,k);
                    String d = s.substring(k);

                    if(Integer.parseInt(a)>255 || Integer.parseInt(b)>255 || Integer.parseInt(c)>255 || Integer.parseInt(d)>255)continue;
                    //前导不为0
                    if((a.length()!=1 && a.charAt(0)==0) || (b.length()!=1 && b.charAt(0)==0) || (c.length()!=1 && c.charAt(0)==0) ||(d.length()!=1 && d.charAt(0)==0))continue;
                    String ip = a+"."+b+"."+c+"."+d;
                    res.add(ip);
                }
            }
        }
        return res;
    }
}
